#include "Juego.h"
#include "./Objetos/Dinamicos/Huevo.h"
#include "./Objetos/Estaticos/Caja.h"
#include "./Objetos/Estaticos/Cerdo.h"
#include "./Objetos/Estaticos/Piso.h"
#include "./Objetos/Estaticos/Catapulta.h"
#include "./Auxiliares/Velocidad.h"
#include "../common/Conversor.h"
#include <vector>
#include <iostream>
#include <unistd.h>

Juego::Juego(short cantidadJugadores)
{
	IDJugadores = 0;
	nivel = 0;
	detectarImpactos = true;
	estado = true;
	ganada = false;
	escenario = new Escenario();
	for (short i = 0; i < cantidadJugadores; i++) {
		Jugador* jugador = new Jugador(IDJugadores);
		IDJugadores++;
		jugadores.push_back(jugador);
	}
}

Juego::~Juego(void)
{
	delete(escenario);
	for ( size_t i = 0; i < jugadores.size() ; i++ )  delete(jugadores[i]);
	this->stop();
}

void Juego::matarObjeto(short id) {
	escenario->matar(id);
}

void Juego::cargarObjeto(Objeto *obj) {
	escenario->addObjeto(obj);
}

void Juego::cargarNivel(Nivel *n){
	for ( size_t i = 0; i < jugadores.size() ; i++ )  jugadores[i]->definir(n->cerdos[i],n->catapultas[i],n->monticulos[i]);
	for ( size_t i = 0; i < n->objetos.size() ; i++ ) escenario->addObjeto(n->objetos[i]);
	tiempo = n->tiempo;
}

void Juego::iniciar() {	
	this->start();
}
void Juego::ejecutar() {
	for (size_t i = 0; i < tiempo; i++) {
		usleep(20000);
		escenario->vivir();
		
		if (detectarImpactos){
			ganada = false;
			for ( size_t d = 0; d < jugadores.size() ; d++ )  if (jugadores[d]->estaVivo()) ganada = true;
			if(!ganada) break;
		}
		if (!detectarImpactos) tiempo++;
		if (!estado) break;
	}
	if (ganada) eventoGanada.emit(0);
	else eventoPerdida.emit(0);
}

std::stack<short> Juego::getIdJugadores() {
	std::stack<short> ids;
	unsigned short i;
	for (i = 0; i < IDJugadores; i++) ids.push(i);
	return ids;
}

void Juego::lanzarHuevo(short idJugador,short velX, short velY) {
	unsigned short i;
	for (i = 0; i < jugadores.size(); i++) {
		if (jugadores[i]->getId() == idJugador){
			jugadores[i]->lanzarHuevo(new Velocidad(velX,velY));
			return;
		}
	}
}

Escenario *Juego::getEscenario() {
	return escenario;
}

void Juego::noDetectarImpactos() {
	detectarImpactos = false;
	escenario->noDetectarImpactos();
	if (!detectarImpactos) tiempo++;
}

void Juego::detenerJuego(bool partidaGanada) {
	estado = false;
	if (partidaGanada) ganada = true;
}

std::string Juego::getPuntos() {
	std::string ret = "";
	for (size_t i = 0; i < jugadores.size(); i++) {
		ret += Conversor::shortToString(jugadores[i]->getId());
		ret += "-";
		ret += Conversor::shortToString(jugadores[i]->getPuntos());
		//ret += "/";
	}
	return ret;
}
